local key=KEYS[1];  -- 锁的标识key

local threadId = ARGV[1]; -- 线程的唯一标识

local releaseTime=ARGV[2]; -- 锁的自动释放时间

-- 判断当前锁是否仍被自己持有
if(redis.call('HEXISTS',key,threadId)==0)then
    return nil;  -- 如果已经不是自己，则直接返回

end;

-- 是自己的锁，则重入次数 -1
local count = redis.call('HINCRBY', key,threadId, -1);

-- 判断重入次数是否已经为0
if(count >0)then
    -- 大于0说明不能释放锁，重置有效期然后返回
    redis.call("EXPIRE",key,releaseTime);
    return nil;
else  --等于0说明可以释放锁，直按删除
    redis.call('DEL', key);
    return nil;
end;